<?php

/**
* @desc Просмотр результатов теста.
* 
*/
class Tests_Frontend_End_Results extends Kernel_Action_Abstract
{
    
    /**
     * Путь к файлу шаблона.
     *
     * @var string
     */
    protected $_template = 'tests/frontend/results.tpl';
    
    /**
     * Реализация обработки пользовательского запроса.
     *
     */
    protected function _process() 
    {
        Application::getResponse()->setTitle(__('RESULTS'));
        
        if (!count($results = $this->_getResults())) return;
        
        $entries = Tests_Utils::explode($results, 'answers', 'right');
        Application::getResponse()->assign(array(
            'entries' => $entries, 
            'rate' => $this->_getRating($entries), 
            ));
    }
    
    /**
    * @desc Возвращает пользовательский набор вопросы => ответы:корректность по текущему юзеру
    * 
    * @return array
    */
    protected function _getResults($user_id = null) 
    {
        $SESSION = Tests_Utils::getSesseion();
        
        $user_id = is_null($user_id) 
            ?  $SESSION['user_id']
            : $user_id;
            
        $query = '
            SELECT 
                   `t_q`.`question`, 
                   GROUP_CONCAT(`t_a`.`answer` SEPARATOR "' . Tests_Utils::$_separator . '") AS `answers`, 
                   GROUP_CONCAT(`t_a`.`right` SEPARATOR "' . Tests_Utils::$_separator . '") AS `right`
              FROM 
                   `user_answers` `u_a` 
        INNER JOIN 
                   `tests_questions` `t_q` 
                ON 
                   `u_a`.`question_id` = `t_q`.`id`
        INNER JOIN 
                   `tests_answers` `t_a` 
                ON 
                   `u_a`.`answer_id` = `t_a`.`id`
             WHERE 
                   `u_a`.`user_id` = ' . $user_id . '
          GROUP BY 
                   `t_q`.`question` 
          ORDER BY 
                   `t_q`.`question` 
               ASC
            ';
        return database::fetchAssoc($query);
    }
    
    /**
    * @desc Оцениваем проходжение теста.
    * 
    * Оценку составляеют след критерии:
    * - разница между кол-вом ответов данных Правильно и общим кол-вом правильных ответов
    * - и отнимаем кол-во ответов данных НЕправильно
    * 
    * @return integer
    */
    protected function _getRating($answered, $test_id = null) 
    {
        $answered_right = $this->_countRightWrongAnswers($answered, Tests_Utils::ANSWER_RIGHT);
        $answered_wrong = $this->_countRightWrongAnswers($answered, Tests_Utils::ANSWER_WRONG);
        $all = $this->_countRightWrongAnswers(
            Tests_Utils::explode(Tests_Utils::getData($test_id), 'answer_titles', 'right'), 
            Tests_Utils::ANSWER_RIGHT
            );
        
        return round(abs(($answered_right - $answered_wrong)*100/$all));
    }
    
    /**
    * @desc Считаем оветы отмеченные как привильные.
    * 
    * @param array $answers
    * @param integer $type - тип подсчета ответов: 0 - неправильный, 1 - правильный
    * 
    * @return integer
    */
    protected function _countRightWrongAnswers($answers, $type=null) 
    {
        $type = !is_null($type) ? $type : Tests_Utils::ANSWER_RIGHT;
        
        $counter = 0;
        foreach ($answers as $item) {
            foreach ($item as $rating) {
                if ($type == $rating) $counter ++;
            }
        }
        return $counter;
    }
    
}